package com.cdtu.ui;


import com.cdtu.backend.utils.MediaUtil;
import com.cdtu.ui.constants.ColorConstant;
import com.formdev.flatlaf.FlatIntelliJLaf;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;

import static com.cdtu.ui.constants.ColorConstant.*;

/**
 * @author Mika
 * @date 2023/08/20 15:00
 * MainUI 类：主页面
 **/
public class MainUI extends JFrame {
    public static void main(String[] args) {
        FlatIntelliJLaf.setup();
        EventQueue.invokeLater(() -> {
            MainUI frame = new MainUI();
            frame.setIconImage(frame.getIconImage("image/amber.png"));
            frame.setTitle("原神启动器-版本:v1.0");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        });
    }

    // JFrame 的宽和高
    public static int WIDTH = 1280;
    public static int HEIGHT = 750;
    public static int WIDTH_OFFSET = 400;
    public static int HEIGHT_OFFSET = 180;
    // 坐标 x,y
    int xx, yy;

    //创建一个容器
    Container ct;
    //创建背景面板。
    BackgroundPanel bgp;
    //创建一个按钮。
    JButton jb;
    // 是否拖拽
    boolean isDraging = false;

    MainUI() {
        setAllSize();
        // 卸掉默认装饰
        this.setUndecorated(true);
        //不采用任何布局方式。
        ct = this.getContentPane();
        // 顶部栏
        topBar();
        this.setLayout(null);
        // 背景图
        //重新绘制背景图片
        bgp = new BackgroundPanel(this.getIconImage("image/ui-background.png")); //参数是一个Image对象,
        bgp.setBounds(0, 0, WIDTH, HEIGHT);
        ct.add(bgp, -1);
        //创建”游戏开始“按钮
        playGameButton();
        // 添加各种监听事件的方法
        addListeners();
    }

    // 顶部栏
    private void topBar() {
        // 关闭应用
        JButton close = new JButton("X");
        close.setForeground(Color.WHITE);
        // 最小化
        JButton min = new JButton("一");
        min.setForeground(Color.WHITE);

        close.setBounds(WIDTH - 60, 0, 60, 30);
        changeButtonToTransparent(close);

        min.setBounds(WIDTH - 60 - 60, 0, 60, 30);
        changeButtonToTransparent(min);

        this.add(close);
        this.add(min);

        // 关闭按钮监听
        close.addActionListener(e -> {
            dispose();
            System.exit(0);
        });
        toggleColor(close, TRANSPARENT, Color.RED);
        // 最小化按钮监听
        min.addActionListener(e -> {
            this.setExtendedState(JFrame.ICONIFIED);
        });
        toggleColor(min, TRANSPARENT, TRANSPARENT_WHITE);
    }
    // 透明化按钮
    public void changeButtonToTransparent(JButton button) {
        button.setBackground(TRANSPARENT);
        button.setBorder(BorderFactory.createEmptyBorder());
    }

    // 切换按钮背景色为目标颜色
    public void toggleBackgroundToColor(JButton button, Color sourceColor, Color targetColor) {
        Color currentBackground = sourceColor.equals(targetColor) ? sourceColor : targetColor;
        button.setBackground(currentBackground);
    }

    // 添加不同的监听器
    private void addListeners() {
        // 窗口大小变化监听器：容器中背景图，按钮重新绘制自适应窗体
        this.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                super.componentResized(e);
                bgp.setSize(MainUI.this.getSize());
                MainUI.HEIGHT = MainUI.this.getHeight();
                MainUI.WIDTH = MainUI.this.getWidth();
                /**
                 * TODO:
                 * 1.如果支持最大化，则需要动态调整 jb
                 * 即 button 的位置需要动态调整，WIDTH_OFFSET 偏移值应该由实际宽度的占比值得到
                 */
                jb.setBounds(WIDTH - WIDTH_OFFSET, HEIGHT - HEIGHT_OFFSET, 250, 80);
                ct.repaint();
            }
        });
        // 实现无边框拖拽界面
        // 监听最初位置
        this.addMouseListener(new MouseAdapter() {    //给JFrame窗体添加一个鼠标监听
            public void mousePressed(MouseEvent e) {     //鼠标点击时记录一下初始位置
                isDraging = true;
                xx = e.getX();
                yy = e.getY();
            }

            public void mouseReleased(MouseEvent e) {  //鼠标松开时
                isDraging = false;
            }
        });
        // 时刻更新鼠标位置
        this.addMouseMotionListener(new MouseMotionAdapter() { //添加指定的鼠标移动侦听器，以接收发自此组件的鼠标移动事件。如果侦听器 l 为 null，则不会抛                                                         出异常并且不执行动作。
            public void mouseDragged(MouseEvent e) {
                // 修改位置
                if (isDraging) {
                    //只要鼠标是点击的（isDraging），就时刻更改窗体的位置
                    int left = getLocation().x;
                    int top = getLocation().y;
                    setLocation(left + e.getX() - xx, top + e.getY() - yy);

                }
            }
        });

    }

    // 设置所有尺寸的大小
    private void setAllSize() {
        // 窗体尺寸
        Dimension dimension = new Dimension(WIDTH, HEIGHT);
        this.setResizable(true);
        this.setMinimumSize(dimension);
        this.setMaximumSize(dimension);
    }

    // 创建按钮
    private void playGameButton() {
        jb = new JButton("开始游戏");
        // 反向设置位置
        jb.setBounds(WIDTH - WIDTH_OFFSET, HEIGHT - HEIGHT_OFFSET, 250, 80);
        jb.setFont(new Font("宋体", Font.BOLD, 32));
        jb.setBackground(ColorConstant.GOLDEN);
        jb.setBorder(BorderFactory.createEmptyBorder());
        // 按钮启动 BootDialog
        jb.addActionListener((e) -> {
//            BootDialog instance = BootDialog.getNormal();
            MediaUtil.directPlayVideo("boot.mp4");
        });
        toggleColor(jb, GOLDEN, TRANSPARENT_GOLDEN);
        ct.add(jb, 0);
    }

    // 添加鼠标 hover 监听
    public void toggleColor(JComponent component, Color origin, Color change) {
        component.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                JButton source = (JButton) e.getSource();
                toggleBackgroundToColor(source, source.getBackground(), change);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                JButton source = (JButton) e.getSource();
                toggleBackgroundToColor(source, source.getBackground(), origin);
            }
        });
    }

    // 获取到 icon 图标
    public Image getIconImage(String path) {
        Toolkit toolkit = this.getToolkit();
        URL icon = ClassLoader.getSystemResource(path);
        return toolkit.getImage(icon);
    }

}

// 背景面板类
class BackgroundPanel extends JPanel {
    Image im;

    public BackgroundPanel(Image im) {
        this.im = im;
        // 设置控件不透明,若是false,那么就是透明
        this.setOpaque(false);
    }

    // 背景被拖拽会被重新绘制
    // 继承自 JPane ,是 Swing 控件需要继承实现的方法,而不是AWT中的Paint()
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        // 绘制指定图像中当前可用的图像。图像的左上角位于该图形上下文坐标空间的 (x, y)。图像中的透明像素不影响该处已存在的像素
        g.drawImage(im, 0, 0, this.getWidth(), this.getHeight(), this);
    }
}